
Rock music is one of the most popular music genre. In the lyric dataset used this time, half songs are rock music. Sometimes, metal music is classified as one certain type of rock music. When people think of rock or metal music, they might expect noise sound and negative lyrics related with violence. Is this idea true? What sililarities and differences do they (rock music and metal music) have?
In this project, to simplify the process of analysing data and to make lyrics more typical, in each genre, songs published by ten artists who owned the most works are selected for further analysis.
Let’s see who are representative artists in rock music.
[1] "elton-john" "bob-dylan" "elvis-costello"
[4] "david-bowie" "bruce-springsteen" "eric-clapton"
[7] "beach-boys" "chicago" "beatles"
[10] "bon-jovi"
What about metal music?
[1] "fall" "anthrax" "fear-factory"
[4] "bathory" "annihilator" "gamma-ray"
[7] "blind-guardian" "cannibal-corpse" "front-line-assembly"
[10] "acid-drinkers"
It seems, at least for me, rock artists are more well-known than metal singers. Next, I will explore rock music and metal music in deep.
Composition of lyrics
Lyrics of songs are made up of a few stem words. Some certain genre of music prefers keeping repeating same words while some does not. What about rock and metal? What is the composition of their lyrics? A boxplot of ratio which is the number of words in lyrics over the number of stem words is drawn to explore the composition of rock lyrics and metal lyrics. Acoording to the boxplot, the ratio of rock musci is higher than that of metal. I would say rock music uses more abundant words than metal. In other word, metal lyrics prefer repeating words.
What do the songs sing about?
Do artists in rock music and metal music really focus on violence, blood and other extreme sences? In this part, by using wordcloud package, I figured out words that appear most frequently in rock and metal music.


The orange word cloud showed that love, time, baby and youre mentioned most frequently by rock musicians. The blue one is the word cloud for metal music and we can see that time, life, world, and live appear a lot. According to word clouds, both two music genres sing about time. While rock musicians are more romantic because their lyrics talk more about love, heart and baby. Metal singers sing about their life and their lyrics contain darker words such as blood, death, hell and kill.
What emotions they express?
Word clouds in the previous session indicated that lyrics of metal music contain darker words, so is it true that metal music deliver more negative emotions? We use same color theme as movie “Inside Out”.


From sentiment plots, it is easy to find out that both rock music and metal songs express colorful emotions by lyrics. There are more darkgoldenrod bars, which represent emotions of anticipation, joy, surprise and trust, in rock music, so rock musicians are more likely to show positive feelings. While for metal music, the top three emotions it expresses are fear, sadness and anger. This result matches what we see from word clouds, and lyrics in metal music do show more negative emotions than rock.
Summary
By conducting above analysis, the following conclusions are drawn.
Lyrics of rock music are derived from richer stem words and rock lyrics repeated words less in one single song.
Both rock and metal music focus on the word time. Lyrics of rock music are more positive and romantic and they sing about love, baby and heart. Metal music mentions dark words which deliver negative emotions such as death, hell and kill more frequently.
LS0tCnRpdGxlOiAiUm9jayBNdXNpYyB2cy4gTWV0YWwgTXVzaWMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiFbXSguLi9maWdzL3JvY2t2c21ldGFsLmpwZykKClxuZXdsaW5lClxuZXdsaW5lClJvY2sgbXVzaWMgaXMgb25lIG9mIHRoZSBtb3N0IHBvcHVsYXIgbXVzaWMgZ2VucmUuIEluIHRoZSBseXJpYyBkYXRhc2V0IHVzZWQgdGhpcyB0aW1lLCBoYWxmIHNvbmdzIGFyZSByb2NrIG11c2ljLiBTb21ldGltZXMsIG1ldGFsIG11c2ljIGlzIGNsYXNzaWZpZWQgYXMgb25lIGNlcnRhaW4gdHlwZSBvZiByb2NrIG11c2ljLiBXaGVuIHBlb3BsZSB0aGluayBvZiByb2NrIG9yIG1ldGFsIG11c2ljLCB0aGV5IG1pZ2h0IGV4cGVjdCBub2lzZSBzb3VuZCBhbmQgbmVnYXRpdmUgbHlyaWNzIHJlbGF0ZWQgd2l0aCB2aW9sZW5jZS4gSXMgdGhpcyBpZGVhIHRydWU/IFdoYXQgc2lsaWxhcml0aWVzIGFuZCBkaWZmZXJlbmNlcyBkbyB0aGV5IChyb2NrIG11c2ljIGFuZCBtZXRhbCBtdXNpYykgaGF2ZT8gICAgIAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQojI0xvYWQgcmVxdWlyZWQgcGFja2FnZXMgZmlyc3QuCgpwYWNrYWdlcy51c2VkPWMoInRtIiwgIndvcmRjbG91ZCIsICJSQ29sb3JCcmV3ZXIiLCAKICAgICAgICAgICAgICAgICJkcGx5ciIsICJ0eWR5dGV4dCIpCgojIGNoZWNrIHBhY2thZ2VzIHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQuCnBhY2thZ2VzLm5lZWRlZD1zZXRkaWZmKHBhY2thZ2VzLnVzZWQsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLnVzZWQpKQojIGluc3RhbGwgYWRkaXRpb25hbCBwYWNrYWdlcwppZihsZW5ndGgocGFja2FnZXMubmVlZGVkKT4wKXsKICBpbnN0YWxsLnBhY2thZ2VzKHBhY2thZ2VzLm5lZWRlZCwgZGVwZW5kZW5jaWVzID0gVFJVRSwKICAgICAgICAgICAgICAgICAgIHJlcG9zPSdodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnJykKfQoKbGlicmFyeSh0bSkKbGlicmFyeSh3b3JkY2xvdWQpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KGRhdGEudGFibGUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KERUKQpsaWJyYXJ5KHNlbnRpbWVudHIpCmxpYnJhcnkoc3l1emhldCkKYGBgCkluIHRoaXMgcHJvamVjdCwgdG8gc2ltcGxpZnkgdGhlIHByb2Nlc3Mgb2YgYW5hbHlzaW5nIGRhdGEgYW5kIHRvIG1ha2UgbHlyaWNzIG1vcmUgdHlwaWNhbCwgaW4gZWFjaCBnZW5yZSwgc29uZ3MgcHVibGlzaGVkIGJ5IHRlbiBhcnRpc3RzIHdobyBvd25lZCB0aGUgbW9zdCB3b3JrcyBhcmUgc2VsZWN0ZWQgZm9yIGZ1cnRoZXIgYW5hbHlzaXMuIAoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQoJy4uL291dHB1dC9wcm9jZXNzZWRfbHlyaWNzLlJEYXRhJykKcm9jazwtZHRfbHlyaWNzJT4lZmlsdGVyKGdlbnJlPT0iUm9jayIpCnJvY2thcnQ8LXJvY2slPiVncm91cF9ieShhcnRpc3QpJT4lc3VtbWFyaXNlKGNvdW50PW4oKSklPiVhcnJhbmdlKGRlc2MoY291bnQpKQpyb2NrZmFtb3VzPC1oZWFkKHJvY2thcnQsMTApJT4lcHVsbChhcnRpc3QpCnRwcm9jazwtcm9jayU+JWZpbHRlcihhcnRpc3QgJWluJSByb2NrZmFtb3VzKSU+JQogIG11dGF0ZShseXJpY3dvcmRzPXVubGlzdChtYXAobHlyaWNzLCBmdW5jdGlvbih4KSBsZW5ndGgodW5saXN0KHN0cnNwbGl0KHgsIHNwbGl0ID0gIiAiKSkpKSksCiAgICAgICAgIHN0ZW1ubz11bmxpc3QobWFwKHN0ZW1tZWR3b3JkcywgZnVuY3Rpb24oeCkgbGVuZ3RoKHVubGlzdChzdHJzcGxpdCh4LCBzcGxpdCA9ICIgIikpKSkpLAogICAgICAgICByYXRpbz1yb3VuZChseXJpY3dvcmRzL3N0ZW1ubywzKSkKCm1ldGFsPC1kdF9seXJpY3MlPiVmaWx0ZXIoZ2VucmU9PSJNZXRhbCIpCm1ldGFsYXJ0PC1tZXRhbCU+JWdyb3VwX2J5KGFydGlzdCklPiVzdW1tYXJpc2UoY291bnQ9bigpKSU+JWFycmFuZ2UoZGVzYyhjb3VudCkpCm1ldGFsZmFtb3VzPC1oZWFkKG1ldGFsYXJ0LDEwKSU+JXB1bGwoYXJ0aXN0KQp0cG1ldGFsPC1tZXRhbCU+JWZpbHRlcihhcnRpc3QgJWluJSBtZXRhbGZhbW91cyklPiUKICBtdXRhdGUobHlyaWN3b3Jkcz11bmxpc3QobWFwKGx5cmljcywgZnVuY3Rpb24oeCkgbGVuZ3RoKHVubGlzdChzdHJzcGxpdCh4LCBzcGxpdCA9ICIgIikpKSkpLAogICAgICAgICBzdGVtbm89dW5saXN0KG1hcChzdGVtbWVkd29yZHMsIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmxpc3Qoc3Ryc3BsaXQoeCwgc3BsaXQgPSAiICIpKSkpKSwgCiAgICAgICAgIHJhdGlvPXJvdW5kKGx5cmljd29yZHMvc3RlbW5vLDMpKQpgYGAKTGV0J3Mgc2VlIHdobyBhcmUgcmVwcmVzZW50YXRpdmUgYXJ0aXN0cyBpbiByb2NrIG11c2ljLiAKYGBge3IgZWNobz1GQUxTRX0Kcm9ja2ZhbW91cwpgYGAKV2hhdCBhYm91dCBtZXRhbCBtdXNpYz8KYGBge3IsIGVjaG89RkFMU0V9Cm1ldGFsZmFtb3VzCmBgYAoKSXQgc2VlbXMsIGF0IGxlYXN0IGZvciBtZSwgcm9jayBhcnRpc3RzIGFyZSBtb3JlIHdlbGwta25vd24gdGhhbiBtZXRhbCBzaW5nZXJzLiBOZXh0LCBJIHdpbGwgZXhwbG9yZSByb2NrIG11c2ljIGFuZCBtZXRhbCBtdXNpYyBpbiBkZWVwLiAKCiMjIENvbXBvc2l0aW9uIG9mIGx5cmljcwpMeXJpY3Mgb2Ygc29uZ3MgYXJlIG1hZGUgdXAgb2YgYSBmZXcgc3RlbSB3b3Jkcy4gU29tZSBjZXJ0YWluIGdlbnJlIG9mIG11c2ljIHByZWZlcnMga2VlcGluZyByZXBlYXRpbmcgc2FtZSB3b3JkcyB3aGlsZSBzb21lIGRvZXMgbm90LiBXaGF0IGFib3V0IHJvY2sgYW5kIG1ldGFsPyBXaGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGVpciBseXJpY3M/IEEgYm94cGxvdCBvZiByYXRpbyB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIGx5cmljcyBvdmVyIHRoZSBudW1iZXIgb2Ygc3RlbSB3b3JkcyBpcyBkcmF3biB0byBleHBsb3JlIHRoZSBjb21wb3NpdGlvbiBvZiByb2NrIGx5cmljcyBhbmQgbWV0YWwgbHlyaWNzLiBBY29vcmRpbmcgdG8gdGhlIGJveHBsb3QsIHRoZSByYXRpbyBvZiByb2NrIG11c2NpIGlzIGhpZ2hlciB0aGFuIHRoYXQgb2YgbWV0YWwuIEkgd291bGQgc2F5IHJvY2sgbXVzaWMgdXNlcyBtb3JlIGFidW5kYW50IHdvcmRzIHRoYW4gbWV0YWwuIEluIG90aGVyIHdvcmQsIG1ldGFsIGx5cmljcyBwcmVmZXIgcmVwZWF0aW5nIHdvcmRzLiAgICAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShzaGlueSkKbGlicmFyeShwbG90bHkpCmRpdihwbG90X2x5KHR5cGUgPSAiYm94IiklPiUKICAgICAgYWRkX2JveHBsb3QoeT10cHJvY2skcmF0aW8sCiAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3I9J29yYW5nZScsIGFscGhhPTAuNSksCiAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0nb3JhbmdlJywgYWxwaGE9MC41KSwKICAgICAgICAgICAgICAgICAgbmFtZT0nUk9DSycpJT4lCiAgICAgIGFkZF9ib3hwbG90KHk9dHBtZXRhbCRyYXRpbywKICAgICAgICAgICAgICAgICAgbWFya2VyPWxpc3QoY29sb3I9J2JsdWUnLGFscGhhPTAuNSksCiAgICAgICAgICAgICAgICAgIGxpbmU9bGlzdChjb2xvcj0nYmx1ZScsIGFscGhhPTAuNSksCiAgICAgICAgICAgICAgICAgIG5hbWU9J01FVEFMJyksCiAgICBhbGlnbj0nY2VudGVyJykKCmBgYAoKCiMjIFdoYXQgZG8gdGhlIHNvbmdzIHNpbmcgYWJvdXQ/ICAKRG8gYXJ0aXN0cyBpbiByb2NrIG11c2ljIGFuZCBtZXRhbCBtdXNpYyByZWFsbHkgZm9jdXMgb24gdmlvbGVuY2UsIGJsb29kIGFuZCBvdGhlciBleHRyZW1lIHNlbmNlcz8gSW4gdGhpcyBwYXJ0LCBieSB1c2luZyAqd29yZGNsb3VkKiBwYWNrYWdlLCBJIGZpZ3VyZWQgb3V0IHdvcmRzIHRoYXQgYXBwZWFyIG1vc3QgZnJlcXVlbnRseSBpbiByb2NrIGFuZCBtZXRhbCBtdXNpYy4gCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpjb3JwdXN0MTwtVkNvcnB1cyhWZWN0b3JTb3VyY2UodHByb2NrJHN0ZW1tZWR3b3JkcykpCndvcmRfdGliYmxldDEgPC0gdGlkeShjb3JwdXN0MSkgJT4lCiAgc2VsZWN0KHRleHQpJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KSU+JQogIGdyb3VwX2J5KHdvcmQpJT4lCiAgc3VtbWFyaXNlKG51bWJlcj1uKCkpCndvcmRjbG91ZCh3b3JkX3RpYmJsZXQxJHdvcmQsIHdvcmRfdGliYmxldDEkbnVtYmVyLAogICAgICAgICAgc2NhbGU9Yyg1LDAuNSksCiAgICAgICAgICBtYXgud29yZHM9MTAwLAogICAgICAgICAgbWluLmZyZXE9MSwKICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwKICAgICAgICAgIHJvdC5wZXI9MC4zLAogICAgICAgICAgdXNlLnIubGF5b3V0PVQsCiAgICAgICAgICByYW5kb20uY29sb3I9RkFMU0UsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJPcmFuZ2VzIikpCmNvcnB1c3QyPC1WQ29ycHVzKFZlY3RvclNvdXJjZSh0cG1ldGFsJHN0ZW1tZWR3b3JkcykpCndvcmRfdGliYmxldDIgPC0gdGlkeShjb3JwdXN0MikgJT4lCiAgc2VsZWN0KHRleHQpJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KSU+JQogIGdyb3VwX2J5KHdvcmQpJT4lCiAgc3VtbWFyaXNlKG51bWJlcj1uKCkpCndvcmRjbG91ZCh3b3JkX3RpYmJsZXQyJHdvcmQsIHdvcmRfdGliYmxldDIkbnVtYmVyLAogICAgICAgICAgc2NhbGU9Yyg1LDAuNSksCiAgICAgICAgICBtYXgud29yZHM9MTAwLAogICAgICAgICAgbWluLmZyZXE9MSwKICAgICAgICAgIHJhbmRvbS5vcmRlcj1GQUxTRSwKICAgICAgICAgIHJvdC5wZXI9MC4zLAogICAgICAgICAgdXNlLnIubGF5b3V0PVQsCiAgICAgICAgICByYW5kb20uY29sb3I9RkFMU0UsCiAgICAgICAgICBjb2xvcnM9YnJld2VyLnBhbCg5LCJCbHVlcyIpLCBtYWluPSJNRVRBTCIpCgpgYGAKVGhlIG9yYW5nZSB3b3JkIGNsb3VkIHNob3dlZCB0aGF0ICoqbG92ZSwgdGltZSwgYmFieSBhbmQgeW91cmUqKiBtZW50aW9uZWQgbW9zdCBmcmVxdWVudGx5IGJ5IHJvY2sgbXVzaWNpYW5zLiBUaGUgYmx1ZSBvbmUgaXMgdGhlIHdvcmQgY2xvdWQgZm9yIG1ldGFsIG11c2ljIGFuZCB3ZSBjYW4gc2VlIHRoYXQgKip0aW1lLCBsaWZlLCB3b3JsZCwgYW5kIGxpdmUqKiBhcHBlYXIgYSBsb3QuIEFjY29yZGluZyB0byB3b3JkIGNsb3VkcywgYm90aCB0d28gbXVzaWMgZ2VucmVzIHNpbmcgYWJvdXQgKip0aW1lKiouIFdoaWxlIHJvY2sgbXVzaWNpYW5zIGFyZSBtb3JlIHJvbWFudGljIGJlY2F1c2UgdGhlaXIgbHlyaWNzIHRhbGsgbW9yZSBhYm91dCAqKmxvdmUsIGhlYXJ0IGFuZCBiYWJ5KiouIE1ldGFsIHNpbmdlcnMgc2luZyBhYm91dCB0aGVpciBsaWZlIGFuZCB0aGVpciBseXJpY3MgY29udGFpbiBkYXJrZXIgd29yZHMgc3VjaCBhcyAqKmJsb29kLCBkZWF0aCwgaGVsbCBhbmQga2lsbCoqLiAgCgojIyBXaGF0IGVtb3Rpb25zIHRoZXkgZXhwcmVzcz8KV29yZCBjbG91ZHMgaW4gdGhlIHByZXZpb3VzIHNlc3Npb24gaW5kaWNhdGVkIHRoYXQgbHlyaWNzIG9mIG1ldGFsIG11c2ljIGNvbnRhaW4gZGFya2VyIHdvcmRzLCBzbyBpcyBpdCB0cnVlIHRoYXQgbWV0YWwgbXVzaWMgZGVsaXZlciBtb3JlIG5lZ2F0aXZlIGVtb3Rpb25zPyBXZSB1c2Ugc2FtZSBjb2xvciB0aGVtZSBhcyBtb3ZpZSAiSW5zaWRlIE91dCIuIApgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZi53b3JkX2NvdW50PWZ1bmN0aW9uKHN0cil7CiAgbGlicmFyeShzdHJpbmdyKQogIHJldHVybihzdHJfY291bnQoc3RyLCAnXFx3KycpKQp9CnNlbnRlbmNlLmxpc3Q8LU5VTEwKcm9ja21ldGFsPC1yYmluZCh0cHJvY2ssIHRwbWV0YWwpCmZvciAoaSBpbiAxOm5yb3cocm9ja21ldGFsKSl7CiAgc2VudGVuY2VzPC11bmxpc3Qoc3Ryc3BsaXQocm9ja21ldGFsJGx5cmljc1tpXSwgc3BsaXQgPSAiXG4iKSkKICBpZihsZW5ndGgoc2VudGVuY2VzKT4xKXsKICAgIGVtb3Rpb25zPC1nZXRfbnJjX3NlbnRpbWVudChzZW50ZW5jZXMpCiAgICB3b3JkLmNvdW50PWYud29yZF9jb3VudChzZW50ZW5jZXMpCiAgICBlbW90aW9ucz1kaWFnKDEvKHdvcmQuY291bnQrMC4wMSkpJSolYXMubWF0cml4KGVtb3Rpb25zKQogICAgc2VudGVuY2UubGlzdD1yYmluZChzZW50ZW5jZS5saXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQocm9ja21ldGFsW2ksMTo3XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGVuY2VzPWFzLmNoYXJhY3RlcihzZW50ZW5jZXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLmNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW90aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudC5pZD0xOmxlbmd0aChzZW50ZW5jZXMpKSkKICAgICB9CiAgICAKfQoKCnNlbnRlbmNlLmxpc3Q9c2VudGVuY2UubGlzdCU+JQogIGZpbHRlcighaXMubmEod29yZC5jb3VudCkpCgoKc2VudGltZW50cGxvdDwtZnVuY3Rpb24oSW4ubGlzdCwgR2VucmUpewogIAogICMiYW5nZXIiICAgICAiYW50aWNpcGF0aW9uIiAgICAgICAgICAiZGlzZ3VzdCIgICAgICJmZWFyIiAgICAgICAKICAjImpveSIgICAgICAgICJzYWRuZXNzIiAgICAgICJzdXJwcmlzZSIgICAgICAgICAidHJ1c3QiCiAgCiAgY29sLnVzZT1jKCJsaWdodCBncmV5IiwgInJlZDIiLCAiZGFya2dvbGRlbnJvZDEiLCAiY2hhcnRyZXVzZTMiLCAiYmx1ZXZpb2xldCIsCiAgICAgICAgICAgICJkYXJrZ29sZGVucm9kMSIsICJkb2RnZXJibHVlMyIsICJkYXJrZ29sZGVucm9kMSIsImRhcmtnb2xkZW5yb2QxIikKICAKICBJbi5saXN0JHRvcGVtb3Rpb249YXBwbHkoc2VsZWN0KEluLmxpc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdlcjp0cnVzdCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB3aGljaC5tYXgpCiAgSW4ubGlzdCR0b3BlbW90aW9uLnY9YXBwbHkoc2VsZWN0KEluLmxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2VyOnRydXN0KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgbWF4KQogIEluLmxpc3QkdG9wZW1vdGlvbltJbi5saXN0JHRvcGVtb3Rpb24udjwwLjAxXT0wCiAgSW4ubGlzdCR0b3BlbW90aW9uPUluLmxpc3QkdG9wZW1vdGlvbisxCiAgCiAgdGVtcD1Jbi5saXN0JHRvcGVtb3Rpb24udgogIEluLmxpc3QkdG9wZW1vdGlvbi52W3RlbXA8MC4wNV09MQogIAogIGRmPUluLmxpc3QlPiUKICAgIGZpbHRlcihnZW5yZT09R2VucmUpJT4lCiAgICBzZWxlY3Qoc2VudC5pZCwgd29yZC5jb3VudCwgCiAgICAgICAgICAgdG9wZW1vdGlvbiwgdG9wZW1vdGlvbi52KQogIAogIHB0Y29sLnVzZT1hbHBoYShjb2wudXNlW2RmJHRvcGVtb3Rpb25dLCBzcXJ0KHNxcnQoZGYkdG9wZW1vdGlvbi52KSkpCiAgCiAgcGxvdChkZiRzZW50LmlkLCBkZiR3b3JkLmNvdW50LAogICAgICAgeGxhYj0iIiwgeWxhYj0iIiwKICAgICAgIGNvbD1wdGNvbC51c2UsCiAgICAgICB0eXBlPSJoIiwKICAgICAgIG1haW49R2VucmUpCn0KCnBhcihtZnJvdz1jKDIsMSkpCnNlbnRpbWVudHBsb3Qoc2VudGVuY2UubGlzdCwgIlJvY2siKQpzZW50aW1lbnRwbG90KHNlbnRlbmNlLmxpc3QsIk1ldGFsIikKCmZvcihpIGluIGMoIlJvY2siLCAiTWV0YWwiKSl7CiAgZW1vLm1lYW5zPWNvbE1lYW5zKHNlbGVjdChzZW50ZW5jZS5saXN0JT4lZmlsdGVyKGdlbnJlPT1pKSwgYW5nZXI6dHJ1c3QpPjAuMDEpCmNvbC51c2U9YygicmVkMiIsICJkYXJrZ29sZGVucm9kMSIsICJjaGFydHJldXNlMyIsICJibHVldmlvbGV0IiwKICAgICAgICAgICAgImRhcmtnb2xkZW5yb2QxIiwgImRvZGdlcmJsdWUzIiwgImRhcmtnb2xkZW5yb2QxIiwiZGFya2dvbGRlbnJvZDEiKQpiYXJwbG90KGVtby5tZWFuc1tvcmRlcihlbW8ubWVhbnMpXSwgbGFzPTIsIGNvbD1jb2wudXNlW29yZGVyKGVtby5tZWFucyldLCBob3Jpej1ULCBtYWluPWkpCn0KYGBgCkZyb20gc2VudGltZW50IHBsb3RzLCBpdCBpcyBlYXN5IHRvIGZpbmQgb3V0IHRoYXQgYm90aCByb2NrIG11c2ljIGFuZCBtZXRhbCBzb25ncyBleHByZXNzIGNvbG9yZnVsIGVtb3Rpb25zIGJ5IGx5cmljcy4gVGhlcmUgYXJlIG1vcmUgZGFya2dvbGRlbnJvZCBiYXJzLCB3aGljaCByZXByZXNlbnQgZW1vdGlvbnMgb2YgYW50aWNpcGF0aW9uLCBqb3ksIHN1cnByaXNlIGFuZCB0cnVzdCwgaW4gcm9jayBtdXNpYywgc28gcm9jayBtdXNpY2lhbnMgYXJlIG1vcmUgbGlrZWx5IHRvIHNob3cgcG9zaXRpdmUgZmVlbGluZ3MuIFdoaWxlIGZvciBtZXRhbCBtdXNpYywgdGhlIHRvcCB0aHJlZSBlbW90aW9ucyBpdCBleHByZXNzZXMgYXJlIGZlYXIsIHNhZG5lc3MgYW5kIGFuZ2VyLiBUaGlzIHJlc3VsdCBtYXRjaGVzIHdoYXQgd2Ugc2VlIGZyb20gd29yZCBjbG91ZHMsIGFuZCBseXJpY3MgaW4gbWV0YWwgbXVzaWMgZG8gc2hvdyBtb3JlIG5lZ2F0aXZlIGVtb3Rpb25zIHRoYW4gcm9jay4gCgojIyBTdW1tYXJ5IApCeSBjb25kdWN0aW5nIGFib3ZlIGFuYWx5c2lzLCB0aGUgZm9sbG93aW5nIGNvbmNsdXNpb25zIGFyZSBkcmF3bi4gCgorIEx5cmljcyBvZiByb2NrIG11c2ljIGFyZSBkZXJpdmVkIGZyb20gcmljaGVyIHN0ZW0gd29yZHMgYW5kIHJvY2sgbHlyaWNzIHJlcGVhdGVkIHdvcmRzIGxlc3MgaW4gb25lIHNpbmdsZSBzb25nLiAgCgorIEJvdGggcm9jayBhbmQgbWV0YWwgbXVzaWMgZm9jdXMgb24gdGhlIHdvcmQgKip0aW1lKiouIEx5cmljcyBvZiByb2NrIG11c2ljIGFyZSBtb3JlIHBvc2l0aXZlIGFuZCByb21hbnRpYyBhbmQgdGhleSBzaW5nIGFib3V0ICoqbG92ZSwgYmFieSBhbmQgaGVhcnQqKi4gTWV0YWwgbXVzaWMgbWVudGlvbnMgZGFyayB3b3JkcyB3aGljaCBkZWxpdmVyIG5lZ2F0aXZlIGVtb3Rpb25zIHN1Y2ggYXMgKipkZWF0aCwgaGVsbCBhbmQga2lsbCoqIG1vcmUgZnJlcXVlbnRseS4gCg==